C++函数

梦想不会自己发光,真正闪耀的是那个为梦狂奔的你。献给知行的孩子们!(Eric.He著)


  本教程将从 C++ 函数的核心概念、声明定义、调用方式到作用域与变量特性,全面拆解 C++ 函数的核心用法,帮助你掌握这一编程中最基础也最重要的核心工具。

教程目录导航

一、C++ 函数的核心概述

1.1 函数的基本概念

C++ 中的函数(Function)是一段封装好的、具有特定功能的可重用代码块,它接收零个或多个输入参数,执行预定的逻辑操作,可选返回一个结果。函数是程序的基本组成单元,遵循 “单一职责” 原则,一个函数只完成一个核心功能。

函数的本质是:将复杂的程序拆分为多个小的、独立的功能模块,每个模块对应一个函数,降低程序复杂度,提升代码复用性和可维护性。

1.2 函数的核心作用

二、函数的声明与定义

2.1 函数的声明

函数声明(Function Declaration)的作用是告诉编译器函数的名称、返回类型和参数类型,让编译器知道函数的“接口”,无需提供具体实现。声明不分配内存,仅做语法校验。

语法格式:


// 函数声明语法
返回值类型 函数名(参数类型1, 参数类型2, ...);
// 或(推荐:带参数名,增强可读性)
返回值类型 函数名(参数类型1 参数名1, 参数类型2 参数名2, ...);
        

示例:


// 声明一个计算两数之和的函数
int calculateSum(int a, int b);

// 声明一个无参数、无返回值的打印函数
void printHello();

// 声明一个接收字符串参数、返回布尔值的函数
bool checkString(const char* str);
        
注意:函数声明必须出现在函数调用之前(除非函数定义在调用之前),否则编译器会报“未定义的标识符”错误;声明的参数名可与定义的参数名不同,但类型和顺序必须完全一致。

2.2 函数的定义(返回类型/函数名/形参/函数体/返回值)

函数定义(Function Definition)是函数的具体实现,包含函数的完整结构:返回类型、函数名、形式参数、函数体、返回值,编译器会为定义的函数分配内存。

完整语法结构:


返回值类型 函数名(形式参数列表) {
    // 函数体:实现具体功能的代码逻辑
    执行语句1;
    执行语句2;
    // ...
    return 返回值; // 非void类型必须有返回值
}
        

核心组成部分解析:

组成部分 说明 示例
返回值类型 函数执行后返回结果的类型,无返回值则用 void intfloatvoidbool
函数名 函数的唯一标识,遵循标识符命名规则,见名知意 calculateSumprintInfo
形式参数(形参) 函数接收的输入参数,包含“类型+名称”,多个参数用逗号分隔;无参数则括号内留空或写 void (int a, float b)(const char* str)
函数体 花括号包裹的代码块,实现函数的核心逻辑 变量定义、运算、循环、条件判断等
返回值 通过 return 语句返回的结果,类型必须与返回值类型一致;void 类型无需 return(或写 return; return a + b;return true;

完整示例:定义一个求和函数


// 函数声明(可选:若定义在调用前,可省略声明)
int calculateSum(int num1, int num2);

// 函数定义
int calculateSum(int num1, int num2) {
    // 函数体:计算两数之和
    int result = num1 + num2;
    // 返回值:返回计算结果
    return result;
}

// 定义无返回值函数
void printHello() {
    // 函数体:打印字符串
    cout << "Hello, C++ Function!" << endl;
    // void类型可省略return
    return;
}
        

三、函数的调用方式

函数定义后需要通过“调用”才能执行,调用时需传递与形参匹配的实参(实际参数),C++ 中核心调用方式分为传值调用和传址调用。

3.1 传值调用

传值调用(Pass by Value)是将实参的值拷贝一份传递给形参,形参和实参在内存中是两个独立的变量。函数内部修改形参的值,不会影响外部实参的值。

语法:


函数名(实参列表);
        

示例:传值调用的特性


#include <iostream>
using namespace std;

// 传值调用函数:修改形参值
void changeValue(int x) {
    x = 100; // 修改形参
    cout << "函数内形参x的值:" << x << endl; // 输出:100
}

int main() {
    int a = 10;
    cout << "调用前实参a的值:" << a << endl; // 输出:10
    // 传值调用
    changeValue(a);
    cout << "调用后实参a的值:" << a << endl; // 输出:10(未被修改)
    return 0;
}
        
特点:传值调用安全(不会意外修改外部变量),但存在拷贝开销(若参数是大型结构体/对象);形参是实参的“临时副本”,函数执行完毕后形参被销毁。

3.2 传址调用(指针/引用)

传址调用(Pass by Address/Reference)是将实参的内存地址传递给形参,函数内部通过地址直接操作外部实参的内存空间,修改形参等价于修改实参。核心分为“指针传址”和“引用传址”两种方式。

方式1:指针传址


#include <iostream>
using namespace std;

// 指针传址函数:通过指针修改实参值
void changeValueByPtr(int* x) {
    *x = 100; // 解引用,修改指针指向的内存值
    cout << "函数内指针指向的值:" << *x << endl; // 输出:100
}

int main() {
    int a = 10;
    cout << "调用前实参a的值:" << a << endl; // 输出:10
    // 指针传址:传递实参的地址
    changeValueByPtr(&a);
    cout << "调用后实参a的值:" << a << endl; // 输出:100(被修改)
    return 0;
}
        

方式2:引用传址(推荐)

引用(&)是变量的“别名”,引用传址无需解引用,语法更简洁,是C++中首选的传址方式。


#include <iostream>
using namespace std;

// 引用传址函数:通过引用修改实参值
void changeValueByRef(int& x) {
    x = 100; // 直接修改引用(等价于修改实参)
    cout << "函数内引用x的值:" << x << endl; // 输出:100
}

int main() {
    int a = 10;
    cout << "调用前实参a的值:" << a << endl; // 输出:10
    // 引用传址:直接传递变量
    changeValueByRef(a);
    cout << "调用后实参a的值:" << a << endl; // 输出:100(被修改)
    return 0;
}
        
特点:传址调用无拷贝开销,可修改外部变量;适合传递大型数据(如结构体、数组)或需要修改外部变量的场景;引用传址比指针更安全(避免野指针)。

四、函数应用实例

以下实例综合运用函数的声明、定义、调用,实现“学生成绩管理”的核心功能:计算平均分、判断是否及格。


#include <iostream>
#include <string>
using namespace std;

// 函数声明
float calculateAverage(float score1, float score2, float score3); // 计算平均分
bool isPass(float average); // 判断是否及格
void printResult(string name, float average, bool pass); // 打印结果

// 主函数(程序入口)
int main() {
    // 输入学生信息
    string name;
    float chinese, math, english;
    cout << "请输入学生姓名:";
    cin >> name;
    cout << "请输入语文成绩:";
    cin >> chinese;
    cout << "请输入数学成绩:";
    cin >> math;
    cout << "请输入英语成绩:";
    cin >> english;

    // 调用函数计算平均分
    float avg = calculateAverage(chinese, math, english);
    // 调用函数判断是否及格
    bool pass = isPass(avg);
    // 调用函数打印结果
    printResult(name, avg, pass);

    return 0;
}

// 定义:计算平均分(传值调用)
float calculateAverage(float score1, float score2, float score3) {
    return (score1 + score2 + score3) / 3.0f;
}

// 定义:判断是否及格(传值调用)
bool isPass(float average) {
    return average >= 60.0f;
}

// 定义:打印结果(传值调用)
void printResult(string name, float average, bool pass) {
    cout << "\n===== " << name << "的成绩报告 =====" << endl;
    cout << "平均分:" << average << endl;
    cout << "是否及格:" << (pass ? "是" : "否") << endl;
}
        

运行结果示例:

请输入学生姓名:张三
请输入语文成绩:85
请输入数学成绩:90
请输入英语成绩:78

===== 张三的成绩报告 =====
平均分:84.3333
是否及格:是
        

五、作用域与变量特性

5.1 作用域的核心概念

作用域(Scope)是变量在程序中可被访问的范围,C++ 中变量的作用域由定义位置决定,核心分为:

核心规则:变量遵循“就近原则”——若局部变量与全局变量同名,局部作用域内优先访问局部变量;作用域内的变量在离开作用域时会被销毁(全局变量除外)。

5.2 全局变量

全局变量(Global Variable)是定义在所有函数外部的变量,存储在全局/静态存储区,程序启动时创建,程序结束时销毁,整个程序的所有函数均可访问(同名局部变量除外)。

示例:全局变量的使用


#include <iostream>
using namespace std;

// 定义全局变量
int globalNum = 100; // 全局作用域

void printGlobal() {
    // 函数内访问全局变量
    cout << "全局变量globalNum的值:" << globalNum << endl; // 输出:100
}

void modifyGlobal() {
    // 函数内修改全局变量
    globalNum = 200;
    cout << "修改后全局变量globalNum的值:" << globalNum << endl; // 输出:200
}

int main() {
    printGlobal();
    modifyGlobal();
    // 主函数内访问全局变量
    cout << "主函数中globalNum的值:" << globalNum << endl; // 输出:200
    return 0;
}
        
注意:全局变量尽量少用——易导致代码耦合度高(一个函数修改会影响所有函数)、可读性差、内存占用持久;可通过 const 修饰全局变量,避免被意外修改。

5.3 局部变量

局部变量(Local Variable)是定义在函数/代码块内的变量,存储在栈区,进入作用域时创建,离开作用域时自动销毁,仅在当前作用域内可访问。

示例:局部变量的特性


#include <iostream>
using namespace std;

// 全局变量
int num = 100;

void testLocal() {
    // 局部变量(与全局变量同名)
    int num = 10;
    // 代码块内的局部变量
    {
        int num = 1;
        cout << "代码块内局部变量num:" << num << endl; // 输出:1(就近原则)
    }
    cout << "函数内局部变量num:" << num << endl; // 输出:10
    // 访问全局变量(需加::作用域解析符)
    cout << "全局变量num:" << ::num << endl; // 输出:100
}

int main() {
    testLocal();
    // 主函数内局部变量
    int a = 5;
    cout << "主函数内局部变量a:" << a << endl; // 输出:5
    return 0;
}
        
特点:局部变量作用域小、生命周期短,不会污染全局环境,是编程中的主要变量类型;局部变量未初始化时值为随机值(垃圾值),使用前必须初始化。

六、注意事项

七、总结

本教程从 C++ 函数的核心概念到实战应用,全面拆解了函数的使用方法。掌握函数的设计与调用,是从“零散代码”到“结构化程序”的关键一步,也是后续学习面向对象、数据结构的重要基础。


返回顶部